package cn.gyn.gynrpc.core.filter;

import cn.gyn.gynrpc.core.api.Filter;
import cn.gyn.gynrpc.core.api.RpcRequest;
import cn.gyn.gynrpc.core.api.RpcResponse;
import cn.gyn.gynrpc.core.util.MethodUtils;
import cn.gyn.gynrpc.core.util.MockUtils;
import lombok.SneakyThrows;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * Mock挡板，模拟方法返回值类型进行直接返回
 * // Mock挡板功能
 *     // A -> B ->C 当一个方法A调了B ，B调了C，如果出了问题，可以通过加挡板D来排查问题出在了哪个环节
 *     // - -> - ->D 如果挡板放在C这里，不执行C的情况下，如果还有问题，那问题就在A或B上，再往前加挡板
 *     // - -> D 若把挡板D加B这里，问题不见了，那就说明问题出在B，比如开发种某个环节比较慢还没好，就用mock代替先测其他环节。
 */
public class MockFilter implements Filter {

    @SneakyThrows
    @Override
    public Object prefilter(RpcRequest request) {
        //先拿到接口的类型，用findmethod
        Class service = Class.forName(request.getService());
        Method method = findMethod(service,request.getMethodSign());
        Class clazz = method.getReturnType();
        return MockUtils.mock(clazz);
    }

    private Method findMethod(Class service, String methodSign) {
        return Arrays.stream(service.getMethods())
                .filter(method -> !MethodUtils.checkLocalMethod(method))
                .filter(method -> methodSign.equals(MethodUtils.methodSign(method)))
                .findFirst().orElse(null);
    }

    @Override
    public Object postfilter(RpcRequest request, RpcResponse response, Object result) {
        return null;
    }
}
